// color_print.h - 简化版带默认颜色的输出库 (stb风格)
// 用法:
//   0. 需要col.hol.h，但是建议在源文件开启#define COL_IMPLEMENTATION
//   1. 在一个C文件中定义 #define COLOR_PRINT_IMPLEMENTATION 后包含此头文件
//   2. 基础用法: cprintf(fmt, ...)  // 使用默认颜色
//   3. 自定义颜色: cprintfc(fg, bg, style, fmt, ...)
//   4. 设置默认颜色: cprintf_set_default(fg, bg, style)
// 跨平台支持: Windows/Linux/macOS

#ifndef COLOR_PRINT_H
#define COLOR_PRINT_H

#include <stdio.h>
#include <stdarg.h>
#define COL_IMPLEMENTATION
#include "col.hol.h"  // 依赖基础颜色定义

// 带默认颜色的printf (用法同printf)
int cprintf(const char* fmt, ...);

// 带自定义颜色的printf
int cprintfc(col_8_t fg, col_bg_8_t bg, col_style_t style, const char* fmt, ...);

// 设置默认颜色 (全局生效)
void cprintf_set_default(col_8_t fg, col_bg_8_t bg, col_style_t style);

// 带颜色的fprintf (输出到指定流)
int cfprintf(FILE* stream, const char* fmt, ...);

// 带自定义颜色的fprintf
int cfprintfc(FILE* stream, col_8_t fg, col_bg_8_t bg, col_style_t style, const char* fmt, ...);

#endif // COLOR_PRINT_H

#ifdef COLOR_PRINT_IMPLEMENTATION

#include <string.h>
#include <stdlib.h>

// 平台兼容层: 终端检测
#ifdef _WIN32
#include <io.h>
#define is_terminal(s) (_isatty(_fileno(s)) != 0)
#else
#include <unistd.h>
#define is_terminal(s) (isatty(fileno(s)) != 0)
#endif

// 内部状态: 默认颜色配置 (仅内部可见)
static struct {
    col_8_t fg;
    col_bg_8_t bg;
    col_style_t style;
} default_color = {
    COL_WHITE,   // 默认前景: 白色
    COL_BG_BLACK,// 默认背景: 黑色
    COL_NORMAL   // 默认样式: 正常
};

// 初始化标记
static int color_inited = 0;

// 初始化颜色支持
static void color_init(void) {
    if (!color_inited) {
        col_init();       // 初始化基础颜色库
        color_inited = 1;
    }
}

// 生成颜色控制序列 (内部函数)
static void get_color_codes(col_8_t fg, col_bg_8_t bg, col_style_t style,
                           char* prefix, size_t prefix_len,
                           char* reset, size_t reset_len) {
    prefix[0] = '\0';
    reset[0] = '\0';
    color_init();
    
    if (!col_supported()) return;

    char s[COL_MAX_CTRL], f[COL_MAX_CTRL], b[COL_MAX_CTRL];
    col_set_style(style, s);
    col_set_fg_8(fg, f);
    col_set_bg_8(bg, b);
    
    snprintf(prefix, prefix_len, "%s%s%s", s, f, b);
    col_reset(reset);
}

// 设置默认颜色
void cprintf_set_default(col_8_t fg, col_bg_8_t bg, col_style_t style) {
    default_color.fg = fg;
    default_color.bg = bg;
    default_color.style = style;
}

// 带默认颜色的printf
int cprintf(const char* fmt, ...) {
    // todo: hackme: 自己设计color
    cprintf_set_default(COL_GREEN, COL_BG_BLACK, COL_BOLD);
    va_list args;
    va_start(args, fmt);
    
    char prefix[COL_MAX_CTRL], reset[COL_MAX_CTRL];
    get_color_codes(default_color.fg, default_color.bg, default_color.style,
                   prefix, sizeof(prefix), reset, sizeof(reset));

    int ret;
    if (col_supported()) {
        fputs(prefix, stdout);
        ret = vfprintf(stdout, fmt, args);
        fputs(reset, stdout);
    } else {
        ret = vfprintf(stdout, fmt, args);
    }
    
    va_end(args);
    return ret;
}

// 带自定义颜色的printf
int cprintfc(col_8_t fg, col_bg_8_t bg, col_style_t style, const char* fmt, ...) {
    va_list args;
    va_start(args, fmt);
    
    char prefix[COL_MAX_CTRL], reset[COL_MAX_CTRL];
    get_color_codes(fg, bg, style, prefix, sizeof(prefix), reset, sizeof(reset));

    int ret;
    if (col_supported()) {
        fputs(prefix, stdout);
        ret = vfprintf(stdout, fmt, args);
        fputs(reset, stdout);
    } else {
        ret = vfprintf(stdout, fmt, args);
    }
    
    va_end(args);
    return ret;
}

// 带默认颜色的fprintf
int cfprintf(FILE* stream, const char* fmt, ...) {
    va_list args;
    va_start(args, fmt);
    
    int ret;
    if (is_terminal(stream)) {
        char prefix[COL_MAX_CTRL], reset[COL_MAX_CTRL];
        get_color_codes(default_color.fg, default_color.bg, default_color.style,
                       prefix, sizeof(prefix), reset, sizeof(reset));

        if (col_supported()) {
            fputs(prefix, stream);
            ret = vfprintf(stream, fmt, args);
            fputs(reset, stream);
        } else {
            ret = vfprintf(stream, fmt, args);
        }
    } else {
        // 非终端输出不添加颜色
        ret = vfprintf(stream, fmt, args);
    }
    
    va_end(args);
    return ret;
}

// 带自定义颜色的fprintf
int cfprintfc(FILE* stream, col_8_t fg, col_bg_8_t bg, col_style_t style, const char* fmt, ...) {
    va_list args;
    va_start(args, fmt);
    
    int ret;
    if (is_terminal(stream)) {
        char prefix[COL_MAX_CTRL], reset[COL_MAX_CTRL];
        get_color_codes(fg, bg, style, prefix, sizeof(prefix), reset, sizeof(reset));

        if (col_supported()) {
            fputs(prefix, stream);
            ret = vfprintf(stream, fmt, args);
            fputs(reset, stream);
        } else {
            ret = vfprintf(stream, fmt, args);
        }
    } else {
        ret = vfprintf(stream, fmt, args);
    }
    
    va_end(args);
    return ret;
}

#endif // COLOR_PRINT_IMPLEMENTATION